package cn.ibizlab.util.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.*;

public class PasswordStrengthValidator {

    private static final Logger log = LoggerFactory.getLogger(PasswordStrengthValidator.class);
    // 定义正则表达式模式
    private static final String UPPERCASE_PATTERN = "(?=.*[A-Z])";
    private static final String LOWERCASE_PATTERN = "(?=.*[a-z])";
    private static final String DIGIT_PATTERN = "(?=.*[0-9])";
    private static final String SPECIAL_CHAR_PATTERN = "(?=.*[!@#$%^&*()_+\\-=\\$\\${};':\"\\\\|,.<>?])";
    private static final String MIN_LENGTH_PATTERN = ".{6,}"; // 最小长度为6

    /**
     * 验证密码是否符合指定的强度要求。
     *
     * @param password 待验证的密码字符串
     * @return 如果密码通过了所有检查，则返回 true；否则返回 false，并打印出不符合的具体原因。
     */
    public static String validPassword(String password, Integer requiredKinds) {
        if(requiredKinds == null)
            requiredKinds = 1;
        if (password == null || password.isEmpty()) {
            return "密码不能为空";
        }

        if (!Pattern.matches(MIN_LENGTH_PATTERN, password)) {
            return "密码长度必须至少为6个字符";
        }

        int requiredFlags = 0;
        if (Pattern.compile(UPPERCASE_PATTERN).matcher(password).find()) {
            requiredFlags++;
        } else {
            log.debug("密码必须包含至少一个大写字母");
        }

        if (Pattern.compile(LOWERCASE_PATTERN).matcher(password).find()) {
            requiredFlags++;
        } else {
            log.debug("密码必须包含至少一个小写字母");
        }

        if (Pattern.compile(DIGIT_PATTERN).matcher(password).find()) {
            requiredFlags++;
        } else {
            log.debug("密码必须包含至少一个数字");
        }

        if (Pattern.compile(SPECIAL_CHAR_PATTERN).matcher(password).find()) {
            requiredFlags++;
        } else {
            log.debug("密码必须包含至少一个特殊字符");
        }

        // 至少需要满足三种类型的字符条件
        if (requiredFlags < requiredKinds) {
            return "密码必须包含至少"+requiredKinds+"种不同的字符类型（大写、小写、数字、特殊字符）";
        }

        return null;
    }

}